package org.stars.daostars.core;

import static org.stars.daostars.core.SqlParameterType.TYPE_ATTRIBUTE;
import static org.stars.daostars.core.SqlParameterType.TYPE_INDEX;

import java.io.Serializable;

import org.stars.util.StringUtility;

/**
 * Gestisce il parametro di una query. L'attributo <code>function</code> rappresenta
 * la funzione statica della classe <code>DaoSqlUtility</code> che deve essere applicato
 * al valore dell'attributo dell'entity bean passato come parametro o agli altri
 * parametri.<p>
 * Esistono due tipi di parametri, quelli che si ricavano dagli attributi di un entity bean e che
 * vengono quindi identificati dal nome dell'attributo, e quelli che vengono passati come parametri
 * liberi alla query, che vengono identificati da un indice che va da 0 a n.
 * 
 * 
 * @author Francesco Benincasa (908099)
 *
 */
public class SqlParameter implements Serializable
{
    private static final long serialVersionUID = -4470137500190150278L;

    /**
     * Costruttore del parametro
     */
    public SqlParameter()
	{
		function		=	"";
		attribute		=	"";
		simpleAttribute	=	"";
		parameterIndex	=	-1;
		type			=	TYPE_ATTRIBUTE;
		value			=	null;
	}  
	
	/**
	 * tipo di parametro
	 */
	private ParameterType type;
	
	/**
	 * nome della funzione
	 */
	private String function;
	
	/**
	 *	nome dell'attributo 
	 */
	private String attribute;
	
	private String simpleAttribute;
	
	/**
	 * @return the simpleAttribute
	 */
	public String getSimpleAttribute() {
		return simpleAttribute;
	}
	/**
	 * @param simpleAttribute the simpleAttribute to set
	 */
	public void setSimpleAttribute(String simpleAttribute) {
		this.simpleAttribute = simpleAttribute;
	}

	/**
	 * indice del parametro indicizzato
	 */
	private int parameterIndex;
	
	/**
	 * nel caso di tipo RESOLVED, include il valore del parametro
	 */
	private Object value;	
		
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString()
	{
		String ret;
		switch(type)
		{
		case TYPE_ATTRIBUTE:
			ret=function.length()==0 ? attribute : function+"("+attribute+")";
			break;
		case TYPE_INDEX:
			ret=function.length()==0 ? String.valueOf(parameterIndex) : function+"("+String.valueOf(parameterIndex)+")";
			break;
		case TYPE_RESOLVED:
			ret=attribute;
			break;
		case TYPE_USER_ATTRIBUTE:
			ret=function.length()==0 ? attribute : function+"("+attribute+")";
			break;
		case TYPE_CONFIG_ATTRIBUTE:
			ret=function.length()==0 ? attribute : function+"("+attribute+")";
			break;			
		default:
			ret="Unknwon type of parameter";
		}		
		
		return ret;
		
	}
	/**
	 * Getter dell'attributo parameterIndex.
	 * @return
	 *		the parameterIndex
	 */
	public int getParameterIndex() {
		return parameterIndex;
	}
	/**
	 * Setter dell'attributo parameterIndex. Imposta il tipo a TYPE_INDEX.
	 * 
	 * @param parameterIndex
	 *		the parameterIndex to set
	 */
	public void setParameterIndex(int parameterIndex) {
		type=TYPE_INDEX;
		this.parameterIndex = parameterIndex;
	}
	/**
	 * Getter dell'attributo attribute.
	 * 
	 * @return
	 *		the attribute
	 */
	public String getAttribute() {
		return attribute;
	}
	/**
	 * Setter dell'attributo attribute. Imposta il tipo a TYPE_ATTRIBUTE.
	 * 
	 * @param value
	 *		the attribute to set
	 */
	public void setAttribute(String value) {
		type=TYPE_ATTRIBUTE;
		value=StringUtility.nvl(value).trim();
		this.attribute = value;
	}
	/**
	 * Getter dell'attributo function.
	 * 
	 * @return
	 *		the function
	 */
	public String getFunction() {
		return function;
	}
	/**
	 * Setter dell'attributo function.
	 * 
	 * @param value
	 *		the function to set
	 */
	public void setFunction(String value) {
		value=StringUtility.nvl(value).trim();
		this.function = value;
	}
	/**
	 * Getter dell'attributo type.
	 * @return
	 *		the type
	 */
	public SqlParameterType getType() {
		return type;
	}
	/**
	 * Setter dell'attributo type.
	 * @param type
	 *		the type to set
	 */
	public void setType(SqlParameterType type) {
		this.type = type;
	}
	/**
	 * @return the value
	 */
	public Object getValue() {
		return value;
	}
	/**
	 * @param value the value to set
	 */
	public void setValue(Object value) {
		this.value = value;
	}	
	
}


